<?php
/**
 * 压缩不同各类的代码，用于产品发布时；也用于某些代码混淆器工具混淆后不认__autoload类文件
 *
 * @author xyma
 *
 */
class IssueHelper
{
	/**
	 * 打包一个项目的所有类文件，打包发布时使用
	 */
	public function model($exclude=array(), $strip_ws=true)
	{
		if($exclude){
			$exclude	=	array_flip($exclude);
		}
		$src_path	=	SRC_PATH;
		$keys	=	array('helper','model');
		$files	=	array();
		
		foreach($keys as $key)
		{
			$dp	=	opendir("{$src_path}/{$key}");
			if(!$dp){
				die("Null {$key} path");
			}
			while($r=readdir($dp))
			{
				if(isset($exclude["{$key}/{$r}"])){
					continue;
				}
				if(preg_match('~\.php$~',$r)){
					$files[]	=	"{$src_path}/{$key}/$r";
				}
			}
			closedir($dp);
		}
		
		self::pack($files, DATA_PATH.'/'.basename(Core::$APP_PATH).'_core.php', $strip_ws);
	}
	
	/**
	 * 控制器与model&helper分开打包
	 */
	public function cntlr($exclude=array(), $strip_ws=true)
	{
		if($exclude){
			$exclude	=	array_flip($exclude);
		}
		$files	=	array();
		$src_path	=	SRC_PATH;
		
		$dp	=	opendir($src_path);
		if(!$dp){
			die("Null {$src_path} path");
		}
		while($r=readdir($dp))
		{
			if(isset($exclude[$r])){
				continue;
			}
			if(preg_match('~\.php$~',$r)){
				$files[]	=	"{$src_path}/$r";
			}
		}
		closedir($dp);
		
		self::pack($files, DATA_PATH.'/'.basename(Core::$APP_PATH).'_cntlr.php', $strip_ws);
	}
	
	/**
	 * 打包framework
	 */
	public function fw()
	{
		//$src_path	=	ROOT_PATH;
		
	}
	
	/**
	 * 打包PHP文件(数组)到单个文件
	 * @param $files		php文件数组
	 * @param $save_path	若提供则保存到指定位置，否则返回内容
	 * @param $strip_ws		是否删除多余空白符
	 */
	function pack($files, $save_path=null, $strip_ws=true)
	{
		$sfunc	=	$strip_ws ? 'php_strip_whitespace' : 'file_get_contents';
		
		$pack_src	=	'';
		foreach($files as $file)
		{
			$pack_src	.=	file_get_contents($file);
		}
		$pack_src	=	preg_replace('~\?>\s*<\?php~m', ";\n", $pack_src);
		
		$tmpname	=	tempnam(DATA_PATH, 'pack_');
		file_put_contents($tmpname, $pack_src);
		if($save_path)
		{
			file_put_contents($save_path, $sfunc($tmpname));
			unlink($tmpname);
			return true;
		}
		else
		{
			$r	=	$sfunc($tmpname);
			unlink($tmpname);
			return $r;
		}
	}
	
	
}

?>